<?php
	require_once(dirname(__FILE__)."/incluir.php");
	class Controller
	{
		public $model;
		public $erros;
		public $mensagem_sucesso; // A mensagem de sucesso caso as operações tenham sido bem sucedidas
		public $mensagem_erro; // A mensagem de erro caso as operações tenham dado erro
		
		// As mensagens de sucesso e erro ao inserir, alterar e excluir um registro (elas encontram-se em dados.php)
		protected $mensagens_sucesso;
		protected $mensagens_erro; 
		
		// Esse construtor inicia o Controller e o Model que o Controller deve estar conectado
		public function __contruct($model, $mensagens_sucesso = null, $mensagens_erro = null)
		{
			// Inicia os valores do Controller
			$this->model = $model;
			$this->erros = array();
			
			if(empty($mensagens_sucesso))
				$this->mensagens_sucesso = array(); // garante que é um array
			else
				$this->mensagens_sucesso = $mensagens_sucesso;
				
			if(empty($mensagens_erro))
				$this->mensagens_erro = array(); // garante que é um array
			else
				$this->mensagens_erro = $mensagens_erro;
		}
		
		// Funções auxiliares
		
		// Se essa função for chamada, quer dizer que os dados foram inseridos/alterados/excluidos com sucesso. 
		// E que é para redirecionar passando a mensagem de sucesso
		protected function redireciona_mostrando_mensagem_sucesso($retorno = './', $mensagem_sucesso = null)
		{
			$this->mensagem_sucesso = isset($mensagem_sucesso) ? $mensagem_sucesso : $this->mensagem_sucesso;
			// Coloca a mensagem de sucesso na Session, para ser exibida na página passada por $retorno (normalmente a index.php)
			$session = new Session();
			$session->redireciona_mostrando_mensagem_sucesso($this->mensagem_sucesso, $retorno);
		}
		
		// Se essa função for chamada, quer dizer que os dados não foram inseridos/alterados/excluidos corretamente. 
		// E que é para redirecionar passando a mensagem de erro
		protected function redireciona_mostrando_mensagem_erro($retorno = './', $mensagem_erro = null)
		{
			$this->mensagem_erro = isset($mensagem_erro) ? $mensagem_erro : $this->mensagem_erro;
			// Coloca a mensagem de sucesso na Session, para ser exibida na página passada por $retorno (normalmente a index.php)
			$session = new Session();
			$session->redireciona_mostrando_mensagem_erro($this->mensagem_erro, $retorno);
		}
		
		// Copia o array com o POST para o array $dados, filtrando os valores de acordo com o BD (só pegará os valores que tem no BD)
		// Também copia o array com o POST para o array $dados_validar, segundo os campos que devem ser validados por essa entidade
		protected function copia_post($post, &$dados, &$dados_validar)
		{
			$sufixo = $this->model->sufixo; // Pega o sufixo normalmente presente nos campos de formulário
			
			// Para dados, o valor de fields é que dirá os valores a serem copiados do post
			foreach($this->model->fields as $field)
			{
				// Procura pelo nome do campo com o sufixo
				if(isset($post[$field.$sufixo]))
				{
					// Se existe elimina o sufixo na hora de copiar
					$dados[$field] = $post[$field.$sufixo];
				}
				else if(isset($post[$field])) // Se não tiver sufixo, tenta sem o sufixo
				{
					$dados[$field] = $post[$field];
				}
			}
			
			// Para dados_validar, é o array de campos (ou seja, que contem todos os campos que precisam de validação),
			// que dirá os valores a serem copiados
			foreach($this->model->campos as $campo)
			{
				$field = $campo->nome;
				// procura pelo nome do campo com o sufixo
				if(isset($post[$field.$sufixo]))
				{
					//se existe elimina o sufixo na hora de copiar
					$dados_validar[$field] = $post[$field.$sufixo];
				}
				else if(isset($post[$field])) // se não tiver sufixo, tenta sem o sufixo
				{
					$dados_validar[$field] = $post[$field];
				}
			}
		}
		
		// Valida os dados dessa entidade
		protected function valida_dados_campos($dados_validar)
		{
			$this->erros = Validador::valida($dados_validar, $this->model->campos); 
			return empty($this->erros); // Se estiver vazio, quer dizer que validou
		}
		
		// Ações (funções públicas que controlam páginas)
		
		// Insere uma linha da entidade no banco de dados
		public function inserir($post, $mensagem_sucesso = null, $mensagem_erro = null)
		{
			if($post) // Se foi passado dados do post
			{
				$dados = array(); // Dados que irão ser inseridos no BD
				$dados_validar = array(); // Dados do formulário que deverão ser validados
				$this->copia_post($post, $dados, $dados_validar); // Copia os dados de $post para $dados e para $dados_validar
				
				if($this->valida_dados_campos($dados_validar)) // Se validou os dados
				{
					if($this->model->inserir($dados)) // Manda o Model inserir os dados no BD
					{
						// Monta a mensagem de sucesso
						$mensagem_default = (!empty($this->mensagens_sucesso['inserir'])) ? $this->mensagens_sucesso['inserir'] : $this->model->nome_entidade . ' inserido com sucesso';
						$this->mensagem_sucesso = isset($mensagem_sucesso) ? $mensagem_sucesso : $mensagem_default;
						$this->redireciona_mostrando_mensagem_sucesso();
					}
					else
					{
						// Monta a mensagem de erro
						$mensagem_default = (!empty($this->mensagens_erro['inserir'])) ? $this->mensagens_erro['inserir'] : "Falha ao inserir a linha atual";
						$this->mensagem_erro = isset($mensagem_erro) ? $mensagem_erro : $mensagem_default;
						$this->erros['inserir'] = $this->mensagem_erro;
					}
				}
			}
		}
		
		// Altera uma linha da entidade no banco de dados, caso um id seja passado ele será usado para isso
		public function alterar($post, $id = null, $mensagem_sucesso = null, $mensagem_erro = null)
		{
			if($post) // Se foi passado dados do post
			{
				$dados = array(); // Dados que irão ser inseridos no BD
				$dados_validar = array(); // Dados do formulário que deverão ser validados
				$this->copia_post($post, $dados, $dados_validar); // Copia os dados de $post para $dados e para $dados_validar
				
				if($this->valida_dados_campos($dados_validar)) // Se validou os dados
				{
					if($this->model->alterar($id, $dados)) // Manda o Model alterar os dados no BD
					{
						// Monta a mensagem de sucesso
						$mensagem_default = (!empty($this->mensagens_sucesso['alterar'])) ? $this->mensagens_sucesso['alterar'] : $this->model->nome_entidade . ' alterado com sucesso';
						$this->mensagem_sucesso = isset($mensagem_sucesso) ? $mensagem_sucesso : $mensagem_default;
						$this->redireciona_mostrando_mensagem_sucesso();
					}
					else
					{
						// Monta a mensagem de erro
						$mensagem_default = (!empty($this->mensagens_erro['alterar'])) ? $this->mensagens_erro['alterar'] : "Falha ao alterar a linha atual";
						$this->mensagem_erro = isset($mensagem_erro) ? $mensagem_erro : $mensagem_default;
						$this->erros['alterar'] = $this->mensagem_erro;
					}
				}
			}		
		}
		
		public function excluir($id = null, $mensagem_sucesso = null, $mensagem_erro = null)
		{
			$session = new Session();
			
			$this->model->excluir_relacionamentos($session, $id); // exclui o elemento nas tabelas de relacionamento
			
			if($this->model->excluir($id))
			{
				// Monta a mensagem de sucesso
				$mensagem_default = (!empty($this->mensagens_sucesso['excluir'])) ? $this->mensagens_sucesso['excluir'] : $this->model->nome_entidade . ' excluido com sucesso';
				$this->mensagem_sucesso = isset($mensagem_sucesso) ? $mensagem_sucesso : $mensagem_default;
				$this->redireciona_mostrando_mensagem_sucesso();
			}
			else
			{
				// Monta a mensagem de erro
				$mensagem_default = (!empty($this->mensagens_erro['excluir'])) ? $this->mensagens_erro['excluir'] : "Falha ao excluir a linha atual";
				$this->mensagem_erro = isset($mensagem_erro) ? $mensagem_erro : $mensagem_default;
				$this->redireciona_mostrando_mensagem_erro();
			}
		}
	}
?>